package com.ynet.middleground.approve.service;

import java.util.List;

import javax.validation.Valid;

import com.ynet.core.common.ServiceResult;
import com.ynet.middleground.approve.bean.*;
import com.ynet.middleground.approve.dto.NextTaskDTO;
import com.ynet.middleground.approve.dto.ServiceResultMobile;
import com.ynet.middleground.approve.dto.TaskDTO;
import com.ynet.middleground.approve.dto.TaskDTOForMobile;

/**
 * @author liulx
 * @description 流程任务处理相关接口服务类
 * @date 2019-10-15 13:58
 */
public interface ProcessTaskService {

    /**
     * 根据流程实例ID，查询当前活动任务 <br />
     * 如果是并行任务（比如会签），可能会有多个，所以用集合接受
     * 
     * @param req 查询当前活动任务请求对象: {流程实例ID}
     * @return 当前任务活动信息
     */
    ServiceResult<List<TaskDTO>> getActiveTaskByInstanceId(@Valid ProcessInstanceReq req);

    /**
     * 分页查询审核任务列表
     * 
     * @param queryTaskReqPager 分页查询任务列表请求对象: {处理人,候选用户,候选用户组,查询任务类型}
     * @return 审核任务列表
     */
    ServiceResult<List<TaskDTO>> listTaskByPage(@Valid QueryTaskReqPager queryTaskReqPager);

    /**
     * 分页查询审核任务列表(移动端专用)
     *
     * @param queryTaskReqPager 分页查询任务列表请求对象
     * @return 审核任务列表
     */
    ServiceResultMobile<List<TaskDTOForMobile>>
        listTaskByPageForMobile(@Valid QueryTaskForMobileReqPager queryTaskReqPager);

    /**
     * 转办任务
     * 
     * @param transferTaskReq 任务处理请求对象: {taskId, assignee, receiver}
     * @return 转办结果标志，以success 字段值标识 true/false
     */
    ServiceResult transferTask(@Valid TransferTaskReq transferTaskReq);

    /**
     * 拾取(认领)任务，指定用户组里的人都可以拾取该任务
     * 
     * @param processTaskReq 任务处理请求对象: {taskId, assignee}
     * @return 转办结果标志，以success 字段值标识 true/false
     */
    ServiceResult claimTask(@Valid ProcessTaskReq processTaskReq);

    /**
     * 归还(还原)任务，指拾取任务后的撤销操作
     * 
     * @param processTaskReq 任务处理请求对象: {taskId, assignee}
     * @return 转办结果标志，以success 字段值标识 true/false
     */
    ServiceResult unclaimTask(@Valid ProcessTaskReq processTaskReq);

    /**
     * 根据任务ID查询任务详情信息
     * 
     * @param taskDetailReq 任务处理请求对象: {taskId}
     * @return 任务详情信息
     */
    ServiceResult<TaskDTO> getTask(@Valid QueryTaskDetailReq taskDetailReq);

    /**
     * 审核任务、完成任务
     * 
     * @param completeTaskReq 完成任务请求对象
     * @return 审核结果标志，以success 字段值标识 true/false
     */
    ServiceResult completeTask(@Valid CompleteTaskReq completeTaskReq);

    /**
     * 自定义任务节点跳转
     * 
     * @param recallTaskReq 任务跳转请求对象
     * @return 跳转处理结果
     */
    ServiceResult customNodeJump(@Valid RecallTaskReq recallTaskReq);

    /**
     * 退回-任务退回至发起人
     * 
     * @param recallTaskReq 任务跳转请求对象
     * @return 退回处理结果
     */
    ServiceResult recallBackToStartUserTask(@Valid RecallTaskReq recallTaskReq);

    /**
     * 驳回-任务退回至上一任务
     * 
     * @param recallTaskReq 任务跳转请求对象
     * @return 跳转处理结果
     */
    ServiceResult rejectToPrevUserTask(@Valid RecallTaskReq recallTaskReq);

    /**
     * 撤回任务
     *
     * @param withDrawTaskReq 任务撤回请求对象
     * @return 撤回任务处理结果
     */
    ServiceResult withDrawTask(@Valid WithDrawTaskReq withDrawTaskReq);

    /**
     * 委派任务
     *
     * @param transferTaskReq 委派任务请求对象: {taskId, receiver}
     * @return 转办结果标志，以success 字段值标识 true/false
     */
    ServiceResult delegateTask(@Valid TransferTaskReq transferTaskReq);

    /**
     * 委派任务归还
     *
     * @param resolveTaskReq 委派任务归还请求对象: {taskId, variables}
     * @return 转办结果标志，以success 字段值标识 true/false
     */
    ServiceResult resolveTask(@Valid ResolveTaskReq resolveTaskReq);

    /**
     * 根据当前任务 id 查询下一个任务节点信息
     * 
     * @param taskDetailReq 查询任务详情信息请求对象，使用当前任务 id
     * @return 下一个任务节点
     */
    ServiceResult<NextTaskDTO> getNextTask(@Valid QueryTaskDetailReq taskDetailReq);

    /**
     * 根据任务 id 和用户 id 查询用户是否有处理该任务的处理权限
     * 
     * @param req 任务处理请求对象
     * @return true/false
     */
    ServiceResult<Boolean> checkTaskPermission(@Valid ProcessTaskReq req);

}
